package cn.yyt.yytravel.base.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

@Component
public class SelfAuthenticationProvider implements AuthenticationProvider {
    //自定义SelfUserDetailsService类 用于进行yo
    @Autowired

    SelfUserDetailsService userDetailsService;

    /**
     * 验证用户登录凭证。
     * @param authentication 包含用户认证信息的对象，如用户名和密码。
     * @return 如果认证成功，返回一个新的UsernamePasswordAuthenticationToken对象，包含用户详细信息和凭证。
     * @throws BadCredentialsException 如果提供的密码与数据库中记录的密码不匹配。
     */
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {

        String userName = (String) authentication.getPrincipal(); // 获取用户名
        String password = (String) authentication.getCredentials(); // 获取密码
        //返回security的用户信息,需要实现
        UserDetails userInfo = userDetailsService.loadUserByUsername(userName); // 从用户详情服务加载用户信息

        // 检查密码是否匹配，不匹配则抛出异常
        if (!userInfo.getPassword().equals(password)) {
            throw new BadCredentialsException("用户名密码不正确，请重新登陆！");
        }

        // 如果认证成功，返回新的认证令牌
        return new UsernamePasswordAuthenticationToken(userInfo, password, userInfo.getAuthorities());
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return true;
    }
}